package com.gupao.javavip.netty.push.server.processor;

import com.gupao.javavip.netty.push.api.MsgType;
import com.gupao.javavip.netty.push.api.PushMsg;
import lombok.extern.apachecommons.CommonsLog;

import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@CommonsLog
public class PushMsgServerService {
    private static volatile Map<String, LinkedList<PushMsg>> msgMap = new ConcurrentHashMap<>();

    private static final String NOTICE_TARGET = "-1";
    private static final Long EXPIRE_TIME = 10 * 1000L;

    public void saveMsg(PushMsg msg) {
        String target = msg.getPushTarget();

        if (msg.getType().equals(MsgType.NOTICE.name())) {
            msg.setPushTarget(NOTICE_TARGET);
            target = msg.getPushTarget();
            log.debug("保存一则公告消息：" + msg.toString());
        } else {
            log.debug("保存[" + target + "]的消息：" + msg.toString());
        }

        if (!msgMap.containsKey(target)) {
            msgMap.put(target, new LinkedList<PushMsg>());
        }
        msgMap.get(target).add(msg);
    }

    public PushMsg getMsg(String target) {
        PushMsg msg = null;

        LinkedList<PushMsg> pushMsgs = msgMap.get(target);
        if (pushMsgs != null && !pushMsgs.isEmpty()) {
            msg = pushMsgs.removeFirst();
        } else {
            pushMsgs = msgMap.get(NOTICE_TARGET);
            if (pushMsgs != null && !pushMsgs.isEmpty()) {
                msg = pushMsgs.getFirst();

                if (isExpire(msg)) {
                    msgMap.get(NOTICE_TARGET).removeFirst();
                    msg = null;
                }
            }
        }

        if (msg == null) {
            log.debug("未获取到[" + target + "]的消息...");
        } else {
            if (msg.getPushTarget().equals(NOTICE_TARGET)) {
                log.debug("获取到一则公告消息：" + msg.toString());
            } else {
                log.debug("获取到[" + target + "]的消息：" + msg.toString());
            }
        }

        return msg;
    }

    private boolean isExpire(PushMsg msg) {
        Long currentTime = System.currentTimeMillis();
        return currentTime - msg.getSendTime() > EXPIRE_TIME;
    }
}
